import alimt20181012, * as $alimt20181012 from '@alicloud/alimt20181012';
import OpenApi, * as $OpenApi from '@alicloud/openapi-client';
import Util, * as $Util from '@alicloud/tea-util';
import * as $tea from '@alicloud/tea-typescript';

export class AliProfessionalClient {
	/**
	 * @remarks
	 * 使用AK&SK初始化账号Client
	 * @returns Client
	 *
	 * @throws Exception
	 */
	static createClient(): alimt20181012 {
		// 工程代码泄露可能会导致 AccessKey 泄露，并威胁账号下所有资源的安全性。以下代码示例仅供参考。
		// 建议使用更安全的 STS 方式，更多鉴权访问方式请参见：https://help.aliyun.com/document_detail/378664.html。

		process.env['ALIBABA_CLOUD_ACCESS_KEY_ID'] = 'LTAI5t5xs6ifRYqsmHwisa3n';
		process.env['ALIBABA_CLOUD_ACCESS_KEY_SECRET'] = '8It96umUWOBtW4iWRktUjScnSb3e4e  ';
		let config = new $OpenApi.Config({
			// 必填，请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
			accessKeyId: process.env['ALIBABA_CLOUD_ACCESS_KEY_ID'].trim(),
			// 必填，请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
			accessKeySecret: process.env['ALIBABA_CLOUD_ACCESS_KEY_SECRET'].trim(),
		});
		// Endpoint 请参考 https://api.aliyun.com/product/alimt
		config.endpoint = `mt.cn-hangzhou.aliyuncs.com`;
		return new alimt20181012(config);
	}

	static async main(args: string[]): Promise<void> {
		let client = AliProfessionalClient.createClient();
		let translateRequest = new $alimt20181012.TranslateRequest({});
		let runtime = new $Util.RuntimeOptions({});
		try {
			// 复制代码运行请自行打印 API 的返回值
			await client.translateWithOptions(translateRequest, runtime);
		} catch (error: any) {
			// 此处仅做打印展示，请谨慎对待异常处理，在工程项目中切勿直接忽略异常。
			// 错误 message
			console.log(error.message);
			// 诊断地址
			console.log(error.data['Recommend']);
		}
	}
}

let proclient = AliProfessionalClient.createClient();
export let aliProfessionalTranslate = async (text: string) => {
	let runtime = new $Util.RuntimeOptions({
		readTimeout: 2000,
		connectTimeout: 2000,
	});
	let context = ''; // 上下文
	let translateProfessionalRequest = new $alimt20181012.TranslateRequest({
		formatType: 'text',
		sourceLanguage: 'auto',
		targetLanguage: 'zh',
		sourceText: text,
		scene: 'general',
		context: context,
	});
	try {
		let result = await proclient.translateWithOptions(translateProfessionalRequest, runtime);
		// console.log(result.body?.data?.translated);
		return result.body?.data?.translated;
	} catch (error: any) {
		console.log(error.message);
		// 诊断地址
		console.log(error.data['Recommend']);
	}
};

// 创建异步运行环境隔离异步操作, 消除异步传染性 ,使用同步循环等待异步操作完成

// run函数提供执行环境
function run(func): any {
	// 定义cache来进行缓存
	const cache: any = {
		status: 'pending',
		data: null,
		err: null,
	};
	// 将原来异步函数进行缓存
	const beforeAsyncFn = aliProfessionalTranslate;
	// 重写myFetch函数
	aliProfessionalTranslate = (...args): any => {
		// 如果发现状态已经不是pending 就返回
		if (cache.status !== 'pending') return cache;
		// 通过抛出错误来执行异步数据请求
		throw beforeAsyncFn(...args)
			.then((res) => {
				// 成功更改缓存状态
				cache.status = 'fulfilled';
				cache.data = res;
			})
			.catch((err) => {
				// 失败改变缓存状态
				cache.status = 'rejected';
				cache.err = err;
			});
	};

	let result = { data: null };
	let done = false;

	try {
		// 使用try 调用原函数 捕获错误
		result = func();
		done = true;
	} catch (err) {
		// 判断返回值是否是promise
		if (err instanceof Promise) {
			// 当通过异常抛出的 promise 发生回调 重新调用 原函数
			err.finally(() => {
				result = func();
				done = true;
				// 还原原始请求方法 不造成污染
				aliProfessionalTranslate = beforeAsyncFn;
			});
		}
	}

	while (!done) {
		// 使用同步循环等待异步操作完成
		deasync.loopWhile(() => !done);
	}
	return result?.data;
}

// 引入 deasync 库来同步等待
const deasync = require('deasync');

// 运行
export const aliyunProfessionalSynch = (text) => {
	const main = () => {
		const data = aliProfessionalTranslate(text);
		return data;
	};
	const result = run(main);
	return result;
};

// console.log(aliyunProfessionalSynch('hello   world   please be  happy  everyday '));
// // 使用隔离环境消除异步传染
